


// 比如查询博客列表， 基于Callback 编写异步的典型写法
// sucessCB, errorCB
var getBlog = (sucessCB, errorCB) => {
    // 业务逻辑处理, 发起一次网络请求, 耗时1秒, 操作1秒就会报超时错误
    // 1.2, 0.8, 1.3
    var timeOut = Math.random() * 2;
    console.log('set timeout to: ' + timeOut + ' seconds.');

    // 设置一个超时时间, 1000毫秒后 执行 超时的处理函数, 这是花1秒来模拟网络IO
    setTimeout(() => {
        // 已经过来1秒
        // 通过timeOut 这个随机的值 来模拟请求的成功或者失败
        if (timeOut < 1) {
            // 成功 报请求成功的结果给到 回调
            // 同步返回: return "success"
            sucessCB("success")
        } else {
            // 失败 我们把失败的错误给到 回调函数
            // 同步返回: return error
            errorCB(new Error("failed"))
        }
    }, 1000)
}

// getBlog((resp) => { console.log(resp)}, (err) => { console.log(err)})



/**
 * Creates a new Promise.
 * @param executor A callback used to initialize the promise. This callback is passed two arguments:
 * a resolve callback used to resolve the promise with a value or the result of another promise,
 * and a reject callback used to reject the promise with a provided reason or error.
 */
// new <T>(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;


// getBlog 由于有2个参数 successCB(any) void, failedCB(any) volid
var p = new Promise(getBlog)

// 可以使用js提供Promise语法
// p.then(
//     (resp) => console.log(resp)
//     ).catch(
//         (err) => console.log(err)
//     ).finally(

//     )

// 使用async + await + promise
// 使用一个Promise 的异步函数, 在异步函数中 可以直接使用await 来等待promise对象的结果
var test = async () => {
    try {
        let  resp = await p
        console.log(resp)
    } catch (err) {
        console.log(err)
    }
}
test()

